package org.assocsp3.dao.impl;

import java.util.List;

import org.assocsp3.dao.GenericDao;
import org.assocsp3.modele.Personne;
import org.hibernate.SessionFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

/**
 * Les mappings sont faits avec des annotations sur la classe Personne
 * Les transaction sont déclarées par des annotations, 
 * Certaines méthodes sont en read-only : 
 * 			optimisation --> amélioration des performances de Hibernate :pas de flush
 */
@Repository
@Transactional//(propagation=Propagation.MANDATORY)
/* mode de propagation MANDATORY :
 * Les méthodes devront obligatoirement etre excutee dans un contexte transactionnel. 
 * Sinon, une exception est levée.
 * Les méthodes read-only seront en REQUIRED : si aucun contexte transactionnel n'existe
 * à l'appel, il sera crée.
 */

@Scope(value="singleton")

public class PersonneDaoImpl implements GenericDao<Personne>{

	private SessionFactory sessionFactory;
	
	public void setSessionFactory(SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}
	
	public void add(Personne o) {
		// IdTransferringMergeEventListener on our SessionFactory.
		sessionFactory.getCurrentSession().merge(o);		
	}
	
	public void update(Personne o) {
		sessionFactory.getCurrentSession().update(o);
	} 

	public void delete(Personne o) {
		sessionFactory.getCurrentSession().delete(o);
		
	}

	@Transactional(propagation=Propagation.REQUIRED,readOnly = true)
	public Personne load(int id) {
		return (Personne) sessionFactory.getCurrentSession().createQuery(
				"from Personne p where p.id = "+id).uniqueResult();
	}

	@Transactional(propagation=Propagation.REQUIRED,readOnly = true)
	@SuppressWarnings("unchecked")
	public List<Personne> loadAll() {
		return sessionFactory.getCurrentSession().createQuery("from Personne p order by p.nom, p.prenom").list();
	}

	@Transactional(propagation=Propagation.REQUIRED,readOnly = true)
	public Personne loadByName(String login) {
		return (Personne) sessionFactory.getCurrentSession().createQuery(
			"from Personne p where p.login = \'"+login+"\'").uniqueResult();
	}    
        
}
